package com.example.test.Utils;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 *
 * 动态代理使用的日志记录
 * joinPoint.getSignature()//获取参数签名
 */
@Aspect
@Component
public class LogUtils {
//    @Before("point()")
//    public static void logStart(JoinPoint joinPoint){
//        System.out.println("【"+joinPoint.getSignature().getName()+"】方法开始执行,调用的参数列表为【"+ Arrays.asList(joinPoint.getArgs()) +"】");
//    }
//    @AfterReturning(value = "point()",returning = "result")
//    public static void logReturn(JoinPoint joinPoint,Object result){
//        System.out.println("【"+joinPoint.getSignature().getName()+"】方法执行完成,结果为【"+result +"】");
//    }
//    @AfterThrowing(value = "point()",throwing = "e")
//    public static void logException(JoinPoint joinPoint,Exception e){
//        System.out.println("【"+joinPoint.getSignature().getName()+"】方法执行出现异常,异常原因为【"+e+"】");
//    }
//    @After("point()")
//    public static void logEnd(JoinPoint joinPoint){
//        System.out.println("【"+joinPoint.getSignature().getName()+"】方法执行完成");
//    }
    //环绕通知，最好用的通知
    @Around(value = "point()")
    public Object webLog(ProceedingJoinPoint points) throws Throwable {
        Object proceed ;
        try {
            System.out.println("【"+points.getSignature().getName()+"】方法开始执行】");
            //等于动态代理中的method.invoke(obj,args),帮我们执行了方法
            proceed = points.proceed(points.getArgs());
            System.out.println("【"+points.getSignature().getName()+"】方法执行完成,结果为【"+proceed +"】");
        } catch (Exception e) {
            System.out.println("【"+points.getSignature().getName()+"】方法执行出现异常,异常原因为【"+e+"】");
            throw new RuntimeException(e);
        }finally {
            System.out.println("【"+points.getSignature().getName()+"】方法执行完成");
        }
        return proceed;
    }
    //可重用的切面点表达式
    @Pointcut(value = "execution(* com.example.test.TestApplication.*(..))")
    public void point(){ }

}
